package com.liu.analysis;


import java.util.List;

import com.liu.system.Error;
import com.liu.system.MyException;
import com.liu.system.Varibles;
import com.liu.system.Word;


/*
 * 语法及语义分析类
 * 创建于2017.3.8
 * @author lyq
 * */
public class SentenceAnalysis {
	/*
	 * 判断是否是保留字
	 * 
	 * @param str 需要判断的字符串
	 * 
	 * @return true代表是保留字，false代表不是保留字
	 */
	public static boolean isKeyWord(String str) {
		for (String keyWord : Word.WORDS) {
			if (keyWord.equals(str)) {
				return true;
			}
		}
		return false;
	}
	
	/*
	 * 进行语法及语义分析
	 * @param list 需要进行分析的字符串队列
	 * @exception 一条语句中出现多个赋值符号
	 * */
	public static void setenceAnalysis(List<String> list) throws MyException{
		//重新将字符串队列连接成一个字符串，方便对语句进行模式识别
		StringBuffer sbf = new StringBuffer();
		for(int i=0;i<list.size();i++){
			sbf.append(list.get(i));
		}
		
		//匹配赋值语句
		if (sbf.toString().matches("[a-zA-Z]+[a-zA-Z0-9]*=[^=]+")) {
			//使用了保留字做变量名
			if(isKeyWord(list.get(0))){
				throw new MyException(Error.NAME_WITH_KEYWORD);
			}
			List<String> subList = list.subList(2, list.size());
			String value = Calculation.forResult(subList);
			Varibles.variblesMap.put(list.get(0), value);
		}
		//匹配输出语句
		else if (sbf.toString().matches("^print\\([^=]+\\)$")) {
			List<String> subList = list.subList(2, list.size()-1);
			String value = Calculation.forResult(subList);
			System.out.println(value);
		}
		//无法识别的语句
		else{
			throw new MyException(Error.UNRECOGNIZED_SENTENCE);
		}
	}
}
